home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 80 / CD Actual 80 Julio-Agosto 2003.iso / Linux / LinuxGazette / lg / issue72 / misc / nielsen / sql / contact.table_functions < prev    next >
Encoding:
Text File  |  2002-08-14  |  26.4 KB  |  677 lines

  1. drop sequence contact_sequence;
  2. create sequence contact_sequence;
  3. drop sequence contact_sequence_backup;
  4. create sequence contact_sequence_backup;
  5. drop table contact;
  6. create table contact (
  7. contact_id int4 NOT NULL PRIMARY KEY DEFAULT nextval('contact_sequence'),
  8.     date_updated  timestamp NOT NULL default CURRENT_TIMESTAMP,
  9.     date_created  timestamp NOT NULL default CURRENT_TIMESTAMP,
  10.     active int2 CHECK (active in (0,1)) DEFAULT 0,
  11. company_name text NOT NULL default '' ,
  12. first text NOT NULL default '' ,
  13. middle text NOT NULL default '' ,
  14. last text NOT NULL default '' ,
  15. email text NOT NULL default '' ,
  16. work_phone text NOT NULL default '' ,
  17. home_phone text NOT NULL default '' ,
  18. address_1 text NOT NULL default '' ,
  19. address_2 text NOT NULL default '' ,
  20. address_3 text NOT NULL default '' ,
  21. city text NOT NULL default '' ,
  22. state text NOT NULL default '' ,
  23. zip text NOT NULL default '' ,
  24. country text NOT NULL default '' 
  25. );drop table contact_backup;
  26. create table contact_backup (
  27. backup_id int4 NOT NULL UNIQUE DEFAULT nextval('contact_sequence_backup'), 
  28.     contact_id int4 NOT NULL DEFAULT 0,
  29.     date_updated  timestamp NOT NULL default CURRENT_TIMESTAMP,
  30.     date_created  timestamp NOT NULL default CURRENT_TIMESTAMP,
  31.     active int2 CHECK (active in (0,1)) DEFAULT 0,
  32.     company_name text NOT NULL default '',
  33. first text NOT NULL default '',
  34. middle text NOT NULL default '',
  35. last text NOT NULL default '',
  36. email text NOT NULL default '',
  37. work_phone text NOT NULL default '',
  38. home_phone text NOT NULL default '',
  39. address_1 text NOT NULL default '',
  40. address_2 text NOT NULL default '',
  41. address_3 text NOT NULL default '',
  42. city text NOT NULL default '',
  43. state text NOT NULL default '',
  44. zip text NOT NULL default '',
  45. country text NOT NULL default '', error_code text NOT NULL DEFAULT ''
  46. );
  47. drop view contact_active;
  48. create view contact_active as select * from contact
  49.         where active = 1;
  50. drop view contact_deleted;
  51. create view contact_deleted as select * from contact
  52.         where active = 0;
  53. drop view contact_backup_ids;
  54. create view contact_backup_ids as 
  55.            select distinct contact_id from contact_backup;
  56. drop view contact_purged;
  57. create view contact_purged as
  58.    select * from contact_backup where oid = ANY (
  59.      select max(oid) from contact_backup where contact_id = ANY
  60.         (
  61.         select distinct contact_id from contact_backup
  62.           where contact_backup.error_code = 'purge'
  63.            and NOT contact_id = ANY (select contact_id from contact)
  64.         )
  65.         group by contact_id
  66.      )
  67.     ;
  68. ---              Generic Functions for Perl/Postgresql version 1.0
  69.  
  70. ---                       Copyright 2001, Mark Nielsen
  71. ---                            All rights reserved.
  72. ---    This Copyright notice was copied and modified from the Perl 
  73. ---    Copyright notice. 
  74. ---    This program is free software; you can redistribute it and/or modify
  75. ---    it under the terms of either:
  76.  
  77. ---        a) the GNU General Public License as published by the Free
  78. ---        Software Foundation; either version 1, or (at your option) any
  79. ---        later version, or
  80.  
  81. ---        b) the "Artistic License" which comes with this Kit.
  82.  
  83. ---    This program is distributed in the hope that it will be useful,
  84. ---    but WITHOUT ANY WARRANTY; without even the implied warranty of
  85. ---    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either
  86. ---    the GNU General Public License or the Artistic License for more details.
  87.  
  88. ---    You should have received a copy of the Artistic License with this
  89. ---    Kit, in the file named "Artistic".  If not, I'll be glad to provide one.
  90.  
  91. ---    You should also have received a copy of the GNU General Public License
  92. ---   along with this program in the file named "Copying". If not, write to the 
  93. ---   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
  94. ---    02111-1307, USA or visit their web page on the internet at
  95. ---    http://www.gnu.org/copyleft/gpl.html.
  96.  
  97. -- create a method to unpurge just one item.  
  98. -- create a method to purge one item. 
  99. --  \i /tmp/Test/sample/contact.table
  100. ---------------------------------------------------------------------
  101.  
  102. drop function sql_contact_insert ();
  103. CREATE FUNCTION sql_contact_insert () RETURNS int4 AS '
  104. DECLARE
  105.     record1 record;  oid1 int4; id int4 :=0; record_backup RECORD;
  106. BEGIN
  107.    insert into contact (date_updated, date_created, active)
  108.         values (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP, 1);
  109.      -- Get the unique oid of the row just inserted. 
  110.    GET DIAGNOSTICS oid1 = RESULT_OID;
  111.      -- Get the contact id. 
  112.    FOR record1 IN SELECT contact_id FROM contact where oid = oid1
  113.       LOOP
  114.       id := record1.contact_id;
  115.    END LOOP;
  116.    
  117.      -- If id is NULL, insert failed or something is wrong.
  118.    IF id is NULL THEN return (-1); END IF;
  119.      -- It should also be greater than 0, otherwise something is wrong.
  120.    IF id < 1 THEN return (-2); END IF;
  121.  
  122.       -- Now backup the data. 
  123.     FOR record_backup IN SELECT * FROM contact where contact_id = id
  124.        LOOP
  125.        insert into contact_backup (contact_id, date_updated, date_created, 
  126.            active, error_code) 
  127.          values (id, record_backup.date_updated, record_backup.date_created,
  128.             record_backup.active, ''insert'');
  129.     END LOOP;
  130.  
  131.      -- Everything has passed, return id as contact_id.
  132.    return (id);
  133. END;
  134. ' LANGUAGE 'plpgsql';
  135. ---------------------------------------------------------------------
  136.  
  137. drop function sql_contact_delete (int4);
  138. CREATE FUNCTION sql_contact_delete (int4) RETURNS int2 AS '
  139. DECLARE
  140.     id int4 := 0;
  141.     id_exists int4 := 0;
  142.     record1 RECORD; 
  143.     record_backup RECORD;
  144.     return_int4 int4 :=0;
  145.  
  146. BEGIN
  147.      -- If the id is not greater than 0, return error.
  148.    id := clean_numeric($1);
  149.    IF id < 1 THEN return -1; END IF;
  150.  
  151.      -- If we find the id, set active = 0. 
  152.    FOR record1 IN SELECT contact_id FROM contact 
  153.           where contact_id = id
  154.       LOOP
  155.       update contact set active=0, date_updated = CURRENT_TIMESTAMP
  156.            where contact_id = id;  
  157.       GET DIAGNOSTICS return_int4 = ROW_COUNT;       
  158.       id_exists := 1;
  159.    END LOOP;
  160.       
  161.      -- If we did not find the id, abort and return -2.  
  162.    IF id_exists = 0 THEN return (-2); END IF;
  163.  
  164.    FOR record_backup IN SELECT * FROM contact where contact_id = id
  165.       LOOP
  166.       insert into contact_backup (contact_id, date_updated, date_created,
  167.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country ,error_code)
  168.            values (record_backup.contact_id, record_backup.date_updated, 
  169.              record_backup.date_updated, record_backup.active
  170.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country , ''delete''
  171.       );
  172.    END LOOP;
  173.  
  174.      -- If id_exists == 0, Return error.
  175.      -- It means it never existed. 
  176.    IF id_exists = 0 THEN return (-1); END IF;
  177.  
  178.      -- We got this far, it must be true, return ROW_COUNT.   
  179.    return (return_int4);
  180. END;
  181. ' LANGUAGE 'plpgsql';
  182.  
  183. ---------------------------------------------------------------------
  184.  
  185. drop function sql_contact_undelete (int4);
  186. CREATE FUNCTION sql_contact_undelete (int4) RETURNS int2 AS '
  187. DECLARE
  188.     id int4 := 0;
  189.     id_exists int4 := 0;
  190.     record1 RECORD; 
  191.     record_backup RECORD;
  192.     return_int4 int4 :=0;
  193.  
  194. BEGIN
  195.      -- If the id is not greater than 0, return error.
  196.    id := clean_numeric($1);
  197.    IF id < 1 THEN return -1; END IF;
  198.  
  199.      -- If we find the id, set active = 1. 
  200.    FOR record1 IN SELECT contact_id FROM contact 
  201.           where contact_id = id
  202.       LOOP
  203.       update contact set active=1, date_updated = CURRENT_TIMESTAMP
  204.            where contact_id = id;  
  205.       GET DIAGNOSTICS return_int4 = ROW_COUNT;       
  206.       id_exists := 1;
  207.    END LOOP;
  208.       
  209.      -- If we did not find the id, abort and return -2.  
  210.    IF id_exists = 0 THEN return (-2); END IF;
  211.  
  212.    FOR record_backup IN SELECT * FROM contact where contact_id = id
  213.       LOOP
  214.       insert into contact_backup (contact_id, date_updated, date_created,
  215.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country ,error_code)
  216.            values (record_backup.contact_id, record_backup.date_updated, 
  217.              record_backup.date_updated, record_backup.active
  218.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country , ''undelete''
  219.       );
  220.    END LOOP;
  221.  
  222.      -- If id_exists == 0, Return error.
  223.      -- It means it never existed. 
  224.    IF id_exists = 0 THEN return (-1); END IF;
  225.  
  226.      -- We got this far, it must be true, return ROW_COUNT.   
  227.    return (return_int4);
  228. END;
  229. ' LANGUAGE 'plpgsql';
  230.  
  231. ---------------------------------------------------------------------
  232. drop function sql_contact_update (int4 , text, text, text, text, text, text, text, text, text, text, text, text, text, text);
  233. CREATE FUNCTION sql_contact_update  (int4 , text, text, text, text, text, text, text, text, text, text, text, text, text, text) 
  234.   RETURNS int2 AS '
  235. DECLARE
  236.     id int4 := 0;
  237.     id_exists int4 := 0;
  238.     record_update RECORD; record_backup RECORD;
  239.     return_int4 int4 :=0;
  240.               var_2 text;
  241.           var_3 text;
  242.           var_4 text;
  243.           var_5 text;
  244.           var_6 text;
  245.           var_7 text;
  246.           var_8 text;
  247.           var_9 text;
  248.           var_10 text;
  249.           var_11 text;
  250.           var_12 text;
  251.           var_13 text;
  252.           var_14 text;
  253.           var_15 text;
  254.  
  255. BEGIN
  256.              var_2 := clean_text($2);
  257.          var_3 := clean_text($3);
  258.          var_4 := clean_text($4);
  259.          var_5 := clean_text($5);
  260.          var_6 := clean_text($6);
  261.          var_7 := clean_text($7);
  262.          var_8 := clean_text($8);
  263.          var_9 := clean_text($9);
  264.          var_10 := clean_text($10);
  265.          var_11 := clean_text($11);
  266.          var_12 := clean_text($12);
  267.          var_13 := clean_text($13);
  268.          var_14 := clean_text($14);
  269.          var_15 := clean_text($15);
  270.  
  271.      -- If the id is not greater than 0, return error.
  272.    id := clean_numeric($1);
  273.    IF id < 1 THEN return -1; END IF;
  274.  
  275.    FOR record_update IN SELECT contact_id FROM contact
  276.          where contact_id = id
  277.       LOOP
  278.       id_exists := 1;
  279.    END LOOP;
  280.  
  281.    IF id_exists = 0 THEN return (-2); END IF;
  282.  
  283.    update contact set date_updated = CURRENT_TIMESTAMP
  284.       , company_name = var_2, first = var_3, middle = var_4, last = var_5, email = var_6, work_phone = var_7, home_phone = var_8, address_1 = var_9, address_2 = var_10, address_3 = var_11, city = var_12, state = var_13, zip = var_14, country = var_15 
  285.         where contact_id = id;
  286.    GET DIAGNOSTICS return_int4 = ROW_COUNT;
  287.  
  288.    FOR record_backup IN SELECT * FROM contact where contact_id = id
  289.       LOOP
  290.      insert into contact_backup (contact_id,
  291.          date_updated, date_created, active
  292.          , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country, error_code)
  293.        values (record_update.contact_id, record_backup.date_updated,
  294.          record_backup.date_updated, record_backup.active
  295.          , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country, ''update''
  296.       );
  297.    END LOOP;
  298.  
  299.      -- We got this far, it must be true, return ROW_COUNT.   
  300.    return (return_int4);
  301. END;
  302. ' LANGUAGE 'plpgsql';
  303. ---------------------------------------------------------------------
  304.  
  305. drop function sql_contact_copy (int4);
  306. CREATE FUNCTION sql_contact_copy (int4) 
  307.   RETURNS int2 AS '
  308. DECLARE
  309.     id int4 := 0;
  310.     id_exists int4 := 0;
  311.     record1 RECORD; record2 RECORD; record3 RECORD;    
  312.     return_int4 int4 := 0;
  313.     id_new int4 := 0;
  314.     contact_new int4 :=0;
  315. BEGIN
  316.      -- If the id is not greater than 0, return error.
  317.    id := clean_numeric($1);
  318.    IF id < 1 THEN return -1; END IF;
  319.  
  320.    FOR record1 IN SELECT contact_id FROM contact where contact_id = id
  321.       LOOP
  322.       id_exists := 1;
  323.    END LOOP;
  324.    IF id_exists = 0 THEN return (-2); END IF;
  325.  
  326.      --- Get the new id
  327.    FOR record1 IN SELECT sql_contact_insert() as contact_insert
  328.       LOOP
  329.       contact_new := record1.contact_insert;
  330.    END LOOP;
  331.      -- If the contact_new is not greater than 0, return error.
  332.    IF contact_new < 1 THEN return -3; END IF;
  333.  
  334.    FOR record2 IN SELECT * FROM contact where contact_id = id
  335.       LOOP
  336.  
  337.      FOR record1 IN SELECT sql_contact_update(contact_new , clean_text(record2.company_name), clean_text(record2.first), clean_text(record2.middle), clean_text(record2.last), clean_text(record2.email), clean_text(record2.work_phone), clean_text(record2.home_phone), clean_text(record2.address_1), clean_text(record2.address_2), clean_text(record2.address_3), clean_text(record2.city), clean_text(record2.state), clean_text(record2.zip), clean_text(record2.country))
  338.         as contact_insert
  339.       LOOP
  340.         -- execute some arbitrary command just to get it to pass. 
  341.       id_exists := 1;
  342.      END LOOP;
  343.    END LOOP;
  344.  
  345.      -- We got this far, it must be true, return new id.   
  346.    return (contact_new);
  347. END;
  348. ' LANGUAGE 'plpgsql';
  349.  
  350. ------------------------------------------------------------------
  351. drop function sql_contact_purge ();
  352. CREATE FUNCTION sql_contact_purge () RETURNS int4 AS '
  353. DECLARE
  354.     record_backup RECORD; oid1 int4 := 0;
  355.     return_int4 int4 :=0;
  356.     deleted int4 := 0;
  357.     delete_count int4 :=0;
  358.     delete_id int4;
  359.  
  360. BEGIN 
  361.  
  362.      -- Now delete one by one. 
  363.    FOR record_backup IN SELECT * FROM contact where active = 0
  364.       LOOP
  365.          -- Record the id we want to delete. 
  366.       delete_id = record_backup.contact_id;
  367.  
  368.       insert into contact_backup (contact_id, date_updated, date_created,
  369.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country ,error_code)
  370.            values (record_backup.contact_id, record_backup.date_updated, 
  371.              record_backup.date_updated, record_backup.active
  372.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country , ''purge''
  373.           );
  374.  
  375.         -- Get the unique oid of the row just inserted. 
  376.       GET DIAGNOSTICS oid1 = RESULT_OID;
  377.  
  378.         -- If oid1 less than 1, return -1
  379.       IF oid1 < 1 THEN return (-2); END IF;
  380.         -- Now delete this from the main table.   
  381.       delete from contact where contact_id = delete_id;
  382.  
  383.         -- Get row count of row just deleted, should be 1. 
  384.       GET DIAGNOSTICS deleted = ROW_COUNT;
  385.         -- If deleted less than 1, return -3
  386.       IF deleted < 1 THEN return (-3); END IF;
  387.       delete_count := delete_count + 1;
  388.  
  389.     END LOOP;
  390.  
  391.      -- We got this far, it must be true, return the number of ones we had.  
  392.    return (delete_count);
  393. END;
  394. ' LANGUAGE 'plpgsql';
  395.  
  396. ------------------------------------------------------------------
  397. drop function sql_contact_purgeone (int4);
  398. CREATE FUNCTION sql_contact_purgeone (int4) RETURNS int4 AS '
  399. DECLARE
  400.     record_backup RECORD; oid1 int4 := 0;
  401.     record1 RECORD;
  402.     return_int4 int4 :=0;
  403.     deleted int4 := 0;
  404.     delete_count int4 :=0;
  405.     delete_id int4;
  406.     purged_no int4 := 0;
  407.  
  408. BEGIN
  409.  
  410.     delete_id := $1;
  411.         -- If purged_id less than 1, return -4
  412.     IF delete_id < 1 THEN return (-4); END IF;
  413.  
  414.    FOR record1 IN SELECT * FROM contact 
  415.       where active = 0 and contact_id = delete_id 
  416.       LOOP
  417.       purged_no := purged_no + 1;
  418.    END LOOP;
  419.  
  420.         -- If purged_no less than 1, return -1
  421.    IF purged_no < 1 THEN return (-1); END IF;
  422.  
  423.      -- Now delete one by one.
  424.    FOR record_backup IN SELECT * FROM contact where contact_id = delete_id
  425.       LOOP
  426.  
  427.       insert into contact_backup (contact_id, date_updated, date_created,
  428.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country ,error_code)
  429.            values (record_backup.contact_id, record_backup.date_updated,
  430.              record_backup.date_updated, record_backup.active
  431.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country , ''purgeone''
  432.           );
  433.  
  434.         -- Get the unique oid of the row just inserted.
  435.       GET DIAGNOSTICS oid1 = RESULT_OID;
  436.  
  437.         -- If oid1 less than 1, return -2
  438.       IF oid1 < 1 THEN return (-2); END IF;
  439.         -- Now delete this from the main table.
  440.       delete from contact where contact_id = delete_id;
  441.  
  442.         -- Get row count of row just deleted, should be 1.
  443.       GET DIAGNOSTICS deleted = ROW_COUNT;
  444.         -- If deleted less than 1, return -3
  445.       IF deleted < 1 THEN return (-3); END IF;
  446.       delete_count := delete_count + 1;
  447.  
  448.     END LOOP;
  449.  
  450.      -- We got this far, it must be true, return the number of ones we had.
  451.    return (delete_count);
  452. END;
  453. ' LANGUAGE 'plpgsql';
  454.  
  455. ------------------------------------------------------------------------
  456. drop function sql_contact_unpurge ();
  457. CREATE FUNCTION sql_contact_unpurge () RETURNS int2 AS '
  458. DECLARE
  459.     record1 RECORD;
  460.     record2 RECORD; 
  461.     record_backup RECORD;
  462.     purged_id int4 := 0;
  463.     purge_count int4 :=0;
  464.     timestamp1 timestamp;
  465.     purged_no int4 := 0;
  466.     oid1 int4 := 0;
  467.     oid_found int4 := 0;
  468.     highest_oid int4 := 0;
  469.  
  470. BEGIN
  471.  
  472.      -- Now get the unique ids that were purged. 
  473.    FOR record1 IN select distinct contact_id from contact_backup 
  474.        where contact_backup.error_code = ''purge''
  475.           and NOT contact_id = ANY (select contact_id from contact)
  476.       LOOP
  477.  
  478.       purged_id := record1.contact_id;
  479.       timestamp1 := CURRENT_TIMESTAMP;
  480.       purged_no := purged_no + 1;
  481.       oid_found := 0;
  482.       highest_oid := 0;
  483.  
  484.         -- Now we have the unique id, find its latest date. 
  485.  
  486.       FOR record2 IN select max(oid) from contact_backup 
  487.           where contact_id = purged_id and error_code = ''purge''
  488.         LOOP 
  489.           -- record we got the date and also record the highest date.
  490.         oid_found := 1; 
  491.         highest_oid := record2.max;
  492.       END LOOP;
  493.  
  494.          -- If the oid_found is 0, return error. 
  495.       IF oid_found = 0 THEN return (-3); END IF;
  496.  
  497.         -- Now we have the latest date, get the values and insert them. 
  498.       FOR record_backup IN select * from contact_backup 
  499.           where oid = highest_oid
  500.         LOOP 
  501.  
  502.       insert into contact_backup (contact_id, date_updated, date_created,
  503.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country ,error_code)
  504.            values (purged_id, record_backup.date_updated, 
  505.              timestamp1, record_backup.active
  506.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country , ''unpurge''
  507.           );
  508.  
  509.         -- Get the unique oid of the row just inserted. 
  510.       GET DIAGNOSTICS oid1 = RESULT_OID;
  511.         -- If oid1 less than 1, return -1
  512.       IF oid1 < 1 THEN return (-1); END IF;
  513.  
  514.       insert into contact (contact_id, date_updated, date_created,
  515.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country)
  516.            values (purged_id, timestamp1,
  517.              timestamp1, record_backup.active
  518.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country );
  519.         -- Get the unique oid of the row just inserted.
  520.       GET DIAGNOSTICS oid1 = RESULT_OID;
  521.         -- If oid1 less than 1, return -2
  522.       IF oid1 < 1 THEN return (-2); END IF;
  523.  
  524.       END LOOP;
  525.  
  526.    END LOOP;
  527.  
  528.      -- We got this far, it must be true, return how many were affected.  
  529.    return (purged_no);
  530. END;
  531. ' LANGUAGE 'plpgsql';
  532.  
  533. ---------------------------------------------------------------------
  534. drop function sql_contact_unpurgeone (int4);
  535. CREATE FUNCTION sql_contact_unpurgeone (int4) RETURNS int2 AS '
  536. DECLARE
  537.     record_id int4;
  538.     record1 RECORD;
  539.     record2 RECORD;
  540.     record_backup RECORD;
  541.     return_int4 int4 :=0;
  542.     purged_id int4 := 0;
  543.     purge_count int4 :=0;
  544.     timestamp1 timestamp;
  545.     purged_no int4 := 0;
  546.     oid1 int4 := 0;
  547.     oid_found int4 := 0;
  548.     highest_oid int4 := 0;
  549.  
  550. BEGIN
  551.  
  552.       purged_id := $1;
  553.         -- If purged_id less than 1, return -1
  554.       IF purged_id < 1 THEN return (-1); END IF;
  555.         --- Get the current timestamp.
  556.       timestamp1 := CURRENT_TIMESTAMP;
  557.  
  558.    FOR record1 IN select distinct contact_id from contact_backup
  559.        where contact_backup.error_code = ''purge''
  560.           and NOT contact_id = ANY (select contact_id from contact)
  561.           and contact_id = purged_id
  562.       LOOP
  563.       purged_no := purged_no + 1;
  564.  
  565.    END LOOP;
  566.  
  567.         -- If purged_no less than 1, return -1
  568.    IF purged_no < 1 THEN return (-3); END IF;
  569.  
  570.         -- Now find the highest oid.  
  571.    FOR record2 IN select max(oid) from contact_backup
  572.           where contact_id = purged_id and error_code = ''purge''
  573.         LOOP
  574.           -- record we got the date and also record the highest date.
  575.         oid_found := 1;
  576.         highest_oid := record2.max;
  577.     END LOOP;
  578.  
  579.          -- If the oid_found is 0, return error.
  580.     IF oid_found = 0 THEN return (-4); END IF;
  581.  
  582.         -- Now get the data and restore it. 
  583.     FOR record_backup IN select * from contact_backup 
  584.           where oid  = highest_oid
  585.         LOOP 
  586.         -- Insert into backup that it was unpurged. 
  587.       insert into contact_backup (contact_id, date_updated, date_created,
  588.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country ,error_code)
  589.            values (purged_id, timestamp1, 
  590.              record_backup.date_created, record_backup.active
  591.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country , ''unpurgeone''
  592.           );
  593.  
  594.         -- Get the unique oid of the row just inserted. 
  595.       GET DIAGNOSTICS oid1 = RESULT_OID;
  596.         -- If oid1 less than 1, return -1
  597.       IF oid1 < 1 THEN return (-1); END IF;
  598.         -- Insert into live table. 
  599.       insert into contact (contact_id, date_updated, date_created,
  600.           active , company_name, first, middle, last, email, work_phone, home_phone, address_1, address_2, address_3, city, state, zip, country)
  601.            values (record_backup.contact_id, timestamp1,
  602.              record_backup.date_updated, record_backup.active
  603.              , record_backup.company_name, record_backup.first, record_backup.middle, record_backup.last, record_backup.email, record_backup.work_phone, record_backup.home_phone, record_backup.address_1, record_backup.address_2, record_backup.address_3, record_backup.city, record_backup.state, record_backup.zip, record_backup.country );
  604.         -- Get the unique oid of the row just inserted.
  605.       GET DIAGNOSTICS oid1 = RESULT_OID;
  606.         -- If oid1 less than 1, return -2
  607.       IF oid1 < 1 THEN return (-2); END IF;
  608.  
  609.       END LOOP;
  610.  
  611.      -- We got this far, it must be true, return how many were affected (1).  
  612.    return (purged_no);
  613. END;
  614. ' LANGUAGE 'plpgsql';
  615.  
  616. insert into contact (contact_id, date_updated, date_created, active)
  617.     values (0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 0);
  618. insert into contact_backup (backup_id, contact_id, 
  619.      date_updated, date_created, active, error_code)
  620.     values (0, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 0, 'table creation');
  621.  
  622.  
  623.  
  624.  
  625. drop function clean_text (text);
  626. CREATE FUNCTION  clean_text (text) RETURNS text AS '
  627.   my $Text = shift;
  628.     # Get rid of whitespace in front. 
  629.   $Text =~ s/^\\s+//;
  630.     # Get rid of whitespace at end. 
  631.   $Text =~ s/\\s+$//;
  632.     # Get rid of anything not text.
  633.   $Text =~ s/[^ a-z0-9\\/\\`\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\_\\=\\+\\\\\\|\[\\{\\]\\}\\;\\:\\''\\"\\,\\<\\.\\>\\?\\t\\n]//gi;
  634.     # Replace all multiple whitespace with one space. 
  635.   $Text =~ s/\\s+/ /g;
  636.   return $Text;
  637. ' LANGUAGE 'plperl';
  638.  -- Just do show you what this function cleans up. 
  639. select clean_text ('       ,./<>?aaa aa      !@#$%^&*()_+| ');
  640.  
  641. drop function clean_alpha (text);
  642. CREATE FUNCTION  clean_alpha (text) RETURNS text AS '
  643.   my $Text = shift;
  644.   $Text =~ s/[^a-z0-9_]//gi;
  645.   return $Text;
  646. ' LANGUAGE 'plperl';
  647.  -- Just do show you what this function cleans up. 
  648. select clean_alpha ('       ,./<>?aaa aa      !@#$%^&*()_+| ');
  649.  
  650. drop function clean_numeric (text);
  651. CREATE FUNCTION  clean_numeric (text) RETURNS int4 AS '
  652.   my $Text = shift;
  653.   $Text =~ s/[^0-9]//gi;
  654.   return $Text;
  655. ' LANGUAGE 'plperl';
  656.  -- Just do show you what this function cleans up.
  657. select clean_numeric ('       ,./<>?aaa aa      !@#$%^&*()_+| ');
  658.  
  659. drop function clean_numeric (int4);
  660. CREATE FUNCTION  clean_numeric (int4) RETURNS int4 AS '
  661.   my $Text = shift;
  662.   $Text =~ s/[^0-9]//gi;
  663.   return $Text;
  664. ' LANGUAGE 'plperl';
  665.  -- Just do show you what this function cleans up.
  666. select clean_numeric (11111);
  667.  
  668.  
  669.  
  670. select sql_contact_insert();
  671. select sql_contact_update(1,1,'Company ABC','Dummy1','','Account','nobody@nowhere.com','','','','','','San Jose','CA','95135','USA');
  672.  
  673. select sql_contact_insert();
  674. select sql_contact_update(2,1,'Company ABC','Dummy2','','Account','nobody2@nowhere.com','','','','','','Columbus','OH','43221','USA');
  675.  
  676. vacuum;
  677.